<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02.显式原型和隐式原型</title>
</head>

<body>
    <!-- 1. 每个函数function都有一个prototype，即显式原型（属性）
         2. 每个实例对象都有一个__proto__,可以称为隐式原型（属性）
         3. 对象的隐式原型的值为其对应的构造函数的是显式原型的值
         4.  内存结构(图片)
         5. 总结: 
            * 函数的prototype属性：在定义函数时自动添加的，默认值是一个空Object对象
            * 对象的__proto__属性: 创建对象时自动添加的，默认值为构造函数的prototype属性值
            * 程序员能够直接操作显式原型，但不能直接操作隐式原型（ES6之前） -->
    <script>
        function Fn() {

        }

        // 1. 每个函数function都有一个prototype,即显式原型
        console.log(Fn.prototype); // 内部语句: Fn.prototype = new Object()
        // 2. 每个实例对象都有一个__proto__,可称为隐式原型
        var fn = new Fn(); // 内部写了一条语句： this.__proto__ = Fn.prototype
        console.log(fn.__proto__);
        // 3.对象的隐式原型的值为其对应构造函数的显式原型的值
        console.log(Fn.prototype === fn.__proto__); // true

        // 如何给所有实例对象添加方法？通过原型
        Fn.prototype.test = function() {
            console.log('test');
        }
        fn.test()
    </script>
</body>

</html>